/* @author Shanmugaesan Shanmugaratnam
 *  @created on 31.10.2008 11:02:07
 *  stellt die GUI dar.
 *  updated on 03.11.08
 *  aktualisiert am 10.11.2008 von Oleg Starodubtsev. 
 *  Menue wurde als externe Klasse gemacht.
 *  aktualisiert am 10.11.2008 von Oleg Starodubtsev
 *  die Methode "actionPerformed" wurde integriert.
 *  updated on 15.11.08 by Shanmugaesan Shanmugaratnam
 *  totally worked over
 *  updated on 18.11.08 by Michael Antemann anpassung an den Controller
 */
package de.fhhannover.inform.wari.grp8.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import de.fhhannover.inform.studienklassen.semester3.GeneralStatics;
import de.fhhannover.inform.wari.grp8.spiel.Logger;

public class Gui extends JFrame implements ActionListener {
	
	private static final long serialVersionUID = 1L;
	Container con;
	Gui_Controller mGuiCon;
	final static int MULDEN_ANZAHL = 6;
	final static int GEWINNMULDEN_IMG_ANZAHL = 36;
	final static int MULDEN_IMG_ANZAHL = 36;
	private static String statusMsg = " :: Klicken Sie auf 'Spiel' um ein neues Spiel zu starten";

	JButton[] mulde_A_btns = new JButton[MULDEN_ANZAHL];
	JButton[] mulde_B_btns = new JButton[MULDEN_ANZAHL];
	ImageIcon[] gewinnmulden_imgs = new ImageIcon[GEWINNMULDEN_IMG_ANZAHL];
	ImageIcon[] gewinnmulden_imgs_help = new ImageIcon[2];
	ImageIcon[] mulden_imgs = new ImageIcon[MULDEN_IMG_ANZAHL];
	ImageIcon[] mulden_imgs_A_help = new ImageIcon[MULDEN_ANZAHL];
	ImageIcon[] mulden_imgs_B_help = new ImageIcon[MULDEN_ANZAHL];
	ImageIcon turn_img = new ImageIcon();

	JLabel[] mulde_A_label = new JLabel[MULDEN_ANZAHL];
	JLabel[] mulde_B_label = new JLabel[MULDEN_ANZAHL];
	JLabel spielerA = new JLabel();
	JLabel spielerB = new JLabel();
	JLabel turnimg_lbl = new JLabel();
	JButton log_lbl;
	JButton gewinn_mulde_A_btn;
	JButton gewinn_mulde_B_btn;
	JLabel gewinn_mulde_A_lbl;
	JLabel gewinn_mulde_B_lbl;
	JPanel north_pnl;
	JPanel south_pnl;
	JTextField statusleiste;
	int[] buf_array = new int[MULDEN_ANZAHL * 2]; // erhalte aktueller
	// Spielbrettzustand
	Logger mylog;
	private int time;
	public Gui(Gui_Controller guicon, String title,int time_in) {
		super(title);
		time= time_in;
		mGuiCon = guicon;
		con = this.getContentPane();
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		con.setLayout(new BorderLayout());
		this.setSize(806, 420);
		this.setLocation(170, 100);
		this.setResizable(false);
		// this.setExtendedState(MAXIMIZED_BOTH);
		north_pnl = new JPanel();
		north_pnl.setPreferredSize(new Dimension(810, 350));
		north_pnl.setLayout(null);
		north_pnl.setBackground(mGuiCon.getColor()); // ca. Orange
		// Color(254,207,118)
		south_pnl = new JPanel();

		log_lbl = new JButton("Logs");
		log_lbl.setBounds(720, 15, 80, 20);
		log_lbl.setBackground(mGuiCon.getColor());
		log_lbl.addActionListener(this);
		north_pnl.add(log_lbl);

		statusleiste = new JTextField(statusMsg, 73); // String,Spaltenanzahl
		statusleiste.setFont(new Font("Arial", 1, 12));
		statusleiste.setEditable(false);
		south_pnl.setPreferredSize(new Dimension(810, 25));
		south_pnl.add(statusleiste);

		cacheGewinnmuldenImgs();
		cacheMuldenImgs();
		initialiseImgs();
		createAndArrangeBoard();
		setTurnImg(true); // true :A ; false : B
		setSpielerA("Spieler A");
		setSpielerB("Spieler B");

		con.add(north_pnl, BorderLayout.NORTH);
		con.add(south_pnl, BorderLayout.SOUTH);
		// this.setVisible(true); // Fenster anzeigen
	}

	public void setMenu(Menu menu) {
		this.setJMenuBar(menu.getMenuBar());
	}

	// original update methode von esan
	// edited by michi 18.11 Disabled icon bekommt auch bilder
	// public void updatePits(int[] curPits){
	// buf_array = curPits ;
	// int z=0;
	// // System.out.println("updatepits aufruf ");
	// for(int i=0;i<MULDEN_ANZAHL;i++){
	// mulden_imgs_A_help[i] = mulden_imgs[buf_array[i]];
	// mulde_A_btns[i].setIcon(mulden_imgs_A_help[i]);
	// mulde_A_btns[i].setDisabledIcon(mulden_imgs_A_help[i]);
	// }
	// for(int i=6;i<(MULDEN_ANZAHL*2);i++) {
	// mulden_imgs_B_help[z] = mulden_imgs[buf_array[i]];
	// mulde_B_btns[z].setIcon(mulden_imgs_B_help[z]);
	// mulde_B_btns[z].setDisabledIcon(mulden_imgs_B_help[z]);
	// z++;
	// }
	// // System.out.println("updatePits in GUI aufruf");
	// }

	public void updatePits(int[] curPits) {
		buf_array = curPits;
		// System.out.println("updatepits aufruf ");
		for (int i = 0; i < MULDEN_ANZAHL; i++) {
			mulden_imgs_A_help[i] = mulden_imgs[buf_array[i]];
			mulde_A_btns[i].setIcon(mulden_imgs_A_help[i]);
			mulde_A_btns[i].setDisabledIcon(mulden_imgs_A_help[i]);
		}
		int z = 5;
		for (int i = 11; i >= (MULDEN_ANZAHL); i--, z--) {
			mulden_imgs_B_help[z] = mulden_imgs[buf_array[i]];
			mulde_B_btns[z].setIcon(mulden_imgs_B_help[z]);
			mulde_B_btns[z].setDisabledIcon(mulden_imgs_B_help[z]);
		}
		// System.out.println("updatePits in GUI aufruf");
	}

	public void updatePitsA(int[] curPits) {
		buf_array = curPits;

		// System.out.println("updatepits aufruf ");
		for (int i = 0; i < MULDEN_ANZAHL; i++) {
			mulden_imgs_A_help[i] = mulden_imgs[buf_array[i]];
			mulde_A_btns[i].setIcon(mulden_imgs_A_help[i]);
			mulde_A_btns[i].setDisabledIcon(mulden_imgs_A_help[i]);
			mulde_A_label[i].setText("" + buf_array[i]);

			sleep();

		}
	}

	public void updatePitsB(int[] curPits) {

		buf_array = curPits;
		for (int i = 5; i >= 0; i--) {
			mulden_imgs_B_help[i] = mulden_imgs[buf_array[i]];
			mulde_B_btns[i].setIcon(mulden_imgs_B_help[i]);
			mulde_B_btns[i].setDisabledIcon(mulden_imgs_B_help[i]);
			mulde_B_label[i].setText("" + buf_array[i]);

			sleep();

		}
		
	}

	public void updatePit(int i, int buf_array) {
		if (i < 6) {
			mulden_imgs_A_help[i] = mulden_imgs[buf_array];
			mulde_A_btns[i].setIcon(mulden_imgs_A_help[i]);
			mulde_A_btns[i].setDisabledIcon(mulden_imgs_A_help[i]);
			mulde_A_label[i].setText("" + buf_array);

		} else {
			i = (6 - i) + 5;
			mulden_imgs_B_help[i] = mulden_imgs[buf_array];
			mulde_B_btns[i].setIcon(mulden_imgs_B_help[i]);
			mulde_B_btns[i].setDisabledIcon(mulden_imgs_B_help[i]);
			mulde_B_label[i].setText("" + buf_array);

		}
		sleep();
	}

	protected void sleep() {
		if (time != 0) {
			try {
				Thread.sleep(time);
				paint(getGraphics());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	protected void updateGewinnMulden(int[] GewinnMulden) {
		sleep();
		this.gewinnmulden_imgs_help[0] = gewinnmulden_imgs[GewinnMulden[0]];
		this.gewinn_mulde_A_btn.setDisabledIcon(gewinnmulden_imgs_help[0]);
		this.gewinnmulden_imgs_help[1] = gewinnmulden_imgs[GewinnMulden[1]];
		this.gewinn_mulde_B_btn.setDisabledIcon(gewinnmulden_imgs_help[1]);
		// System.out.println("updateGewinnMulden in GUI aufruf");
	}

	public void initialiseImgs() {
		for (int i = 0; i < MULDEN_ANZAHL; i++) {
			mulden_imgs_A_help[i] = mulden_imgs[0];
			mulden_imgs_B_help[i] = mulden_imgs[0];
		}
		gewinnmulden_imgs_help[0] = gewinnmulden_imgs[0];
		gewinnmulden_imgs_help[1] = gewinnmulden_imgs[0];
	}

	public void createAndArrangeBoard() {
		createMuldenA(mulden_imgs_A_help);
		createMuldenB(mulden_imgs_B_help);
		createAndArrangeGewinnMulden(gewinnmulden_imgs_help);
	}

	public void createMuldenA(ImageIcon[] imgs) {
		for (int index = 0; index < MULDEN_ANZAHL; index++) { // Untere Mulden
			// einfügen
			mulde_A_btns[index] = new JButton("");
			mulde_A_btns[index].setBounds(100 * (index + 1), 200, 100, 100); // x,y,width,height
			mulde_A_btns[index].addActionListener(this); // von Oleg.
			mulde_A_label[index] = new JLabel("0");
			mulde_A_label[index].setBounds(100 * (index + 1) + 50, 298, 20, 20);
			mulde_A_btns[index].setIcon(imgs[index]);
			mulde_A_btns[index].setDisabledIcon(imgs[index]);
			mulde_A_btns[index].setEnabled(false);
			north_pnl.add(mulde_A_btns[index]);
			north_pnl.add(mulde_A_label[index]);
		}
	}

	public void createMuldenB(ImageIcon[] imgs) {
		for (int index = 0; index < MULDEN_ANZAHL; index++) { // Obere Mulden
			// einfügen
			mulde_B_btns[index] = new JButton("");
			mulde_B_btns[index].setBounds(100 * (index + 1), 100, 100, 100); // x,y,width,height
			mulde_B_btns[index].addActionListener(this); // von Oleg.
			mulde_B_label[index] = new JLabel("0");
			mulde_B_label[index].setBounds(100 * (index + 1) + 50, 80, 20, 20);
			mulde_B_btns[index].setDisabledIcon(imgs[index]);
			mulde_B_btns[index].setEnabled(false);
			mulde_B_btns[index].setIcon(imgs[index]);
			north_pnl.add(mulde_B_btns[index]);
			north_pnl.add(mulde_B_label[index]);
		}
	}

	public void createAndArrangeGewinnMulden(ImageIcon[] imgs) {
		gewinn_mulde_A_btn = new JButton("");
		gewinn_mulde_A_btn.setBounds(700, 100, 100, 200); // x,y,width,height
		gewinn_mulde_A_lbl = new JLabel("0");
		gewinn_mulde_A_lbl.setBounds(750, 80, 20, 20);
		// if(which.equals("A") ){
		gewinn_mulde_A_btn.setEnabled(false);
		gewinn_mulde_A_btn.setDisabledIcon(imgs[0]);
		gewinn_mulde_A_btn.setIcon(imgs[0]);
		// }
		north_pnl.add(gewinn_mulde_A_btn);
		north_pnl.add(gewinn_mulde_A_lbl);
		gewinn_mulde_B_btn = new JButton(""); // erste Mulde bzw Gewinnmulde
		// von rechts gesehen.
		gewinn_mulde_B_btn.setBounds(0, 100, 100, 200); // x,y,width,height
		gewinn_mulde_B_lbl = new JLabel("0");
		gewinn_mulde_B_lbl.setBounds(50, 80, 20, 20);
		// if(which.equals("B")){
		gewinn_mulde_B_btn.setEnabled(false);
		gewinn_mulde_B_btn.setDisabledIcon(imgs[1]);
		gewinn_mulde_B_btn.setIcon(imgs[1]);
		// }
		north_pnl.add(gewinn_mulde_B_btn);
		north_pnl.add(gewinn_mulde_B_lbl);
	}

	public void cacheGewinnmuldenImgs() {
		for (int index = 0; index < GEWINNMULDEN_IMG_ANZAHL; index++) {
			gewinnmulden_imgs[index] = GeneralStatics.createImageIcon(
					"/images/gewinn_mulde_" + Integer.toString(index) + ".jpg",
					"Gewinnmulde", this);
		}
	}

	public void cacheMuldenImgs() {
		for (int index = 0; index < MULDEN_IMG_ANZAHL; index++) {
			mulden_imgs[index] = GeneralStatics.createImageIcon(
					"/images/wari_mulde_" + Integer.toString(index) + ".jpg",
					"Mulde", this);
		}
	}

	// Edited by michi 18.11 , alle in einer aktivieren und deaktivieren, bei ki
	// im controler deaktivieren per if.
	protected void activateBoard(boolean seiteA, boolean seiteB) {
		for (int i = 0; i < MULDEN_ANZAHL; i++) {
			if (seiteA && !seiteB) {
				mulde_A_btns[i].setEnabled(true);
				mulde_B_btns[i].setEnabled(false);
			}
			if (seiteB && !seiteA) {
				mulde_A_btns[i].setEnabled(false);
				mulde_B_btns[i].setEnabled(true);
			}
			if (seiteB && seiteA) {
				mulde_A_btns[i].setEnabled(true);
				mulde_B_btns[i].setEnabled(true);
			}
			if (!seiteB && !seiteA) {
				mulde_A_btns[i].setEnabled(false);
				mulde_B_btns[i].setEnabled(false);
				
			}
		}
	}

	protected void deactivateBoard(boolean seite, int muldeIndex) { // true ist
		// Seite-A
		// false ist
		// B und der
		// Muldenindex
		// zu
		// deaktivieren
		if (seite)
			mulde_A_btns[muldeIndex].setEnabled(false);
		else
			mulde_B_btns[muldeIndex].setEnabled(false);
	}

	// edited by michi 19.11 modifiziert, es werden jetzt die leeren mulden
	// deaktiviert
	protected void deactivateBoard(boolean seite, int[] curPits) { // true ist
		// Seite-A
		// false ist
		// B und der
		// Muldenindexarray
		// zu
		// deaktivieren
		for (int i = 0; i < MULDEN_ANZAHL; i++) {
			if (seite && curPits[i] == 0)
				mulde_A_btns[i].setEnabled(false);
			if (!seite && curPits[i] == 0)
				mulde_B_btns[i].setEnabled(false);
		}
	}

	public void setSpielerA(String name) {
		spielerA.setText(name);
		spielerA.setBounds(380, 320, 250, 20);
		spielerA.setForeground(new Color(21, 143, 53));
		spielerA.setFont(new Font("Arial", 1, 14)); // Name,style,size
		north_pnl.add(spielerA);
	}

	public void setSpielerB(String name) {
		spielerB.setText(name);
		spielerB.setBounds(380, 50, 250, 20);
		spielerB.setForeground(new Color(21, 143, 53));
		spielerB.setFont(new Font("Arial", 1, 14)); // Name,style,size
		north_pnl.add(spielerB);
	}

	public void setTurnImg(boolean seite) { // Seite : true ist A false ist B
		turn_img = GeneralStatics.createImageIcon("/images/turnarray.jpg",
				"Turn_Img", this);
		turnimg_lbl.setIcon(turn_img);
		if (seite)
			turnimg_lbl.setBounds(330, 318, 35, 25);
		else
			turnimg_lbl.setBounds(330, 48, 35, 25);
		north_pnl.add(turnimg_lbl);
	}

	protected void setStatusMsg(String msg) {
		this.statusleiste.setText(msg);
	}

	protected void setMuldenLabel(int[] curPits) {
		buf_array = curPits;
		int z = 0;
		for (int i = 0; i < MULDEN_ANZAHL; i++) {
			mulde_A_label[i].setText("" + buf_array[i]);
		}
		for (int i = 6; i < (MULDEN_ANZAHL * 2); i++) {
			mulde_B_label[z].setText("" + buf_array[i]);
			z++;
		}
		// System.out.println("setMuldenLabel in GUI aufruf");
	}

	protected void setGewinnMuldenLabel(int[] gmulden) {
		gewinn_mulde_A_lbl.setText("" + gmulden[0]);
		gewinn_mulde_B_lbl.setText("" + gmulden[1]);
	}

	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();
		for (int i = 0; i < MULDEN_ANZAHL; i++) {
			if (source == mulde_A_btns[i]) {
				// System.out.println("Mulden_A_Button " + i + " wurde
				// gedruckt");
				// setTurnImg(false);
				mGuiCon.forwardMove(i);
			}
			if (source == mulde_B_btns[i]) {
				// System.out.println("Mulden_B_Button " + i + " wurde
				// gedruckt");
				// setTurnImg(true);
				mGuiCon.forwardMove(i);
			}
		}
		if (source == log_lbl) { // Logfenster aufpoppen
			try {
				mGuiCon.showLogger();
			} catch (Exception ex) {
			}
		}
	}

}
